package com.ng.common.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.alibaba.fastjson.JSONObject;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Record;
import com.ng.common.model.dto.ParsedSql;

public class ParsedSqlUtil {
	
	/**
	 * 解析SQL和参数
	 */
	public static ParsedSql parseSql(String sql, List<JSONObject> fields, JSONObject params) {
		List<JSONObject> assignFields = ParamFieldParseUtil.assignValuesToFields(fields, JSONObject.toJSONString(params));
		
		// 解析SQL参数
		List<Object> paramValues = new ArrayList<>();
		if (assignFields != null && !assignFields.isEmpty()) {
			// 替换SQL中的参数占位符
			for (JSONObject jsonObject : assignFields) {
				if(jsonObject != null) {
					String identifier = jsonObject.getString("identifier");
					String replaceContent = jsonObject.getString("replaceContent");
					Object defaultValue = jsonObject.get("value");
					
					if(defaultValue == null || StrKit.isBlank(identifier) || StrKit.isBlank(defaultValue.toString())) {
						sql = sql.replace(replaceContent, "");
					}
					else {
						sql = sql.replace(replaceContent, replaceContent.replace("${" + identifier + "}", "?"));
						paramValues.add(defaultValue);
					}
				}
			}
			//return new ParsedSql(sql, paramValues);
		}
		return new ParsedSql(sql, paramValues);
	}
	
	/**
	 * 解析InfluxDB查询语句和参数
	 * @param flux Flux查询语句
	 * @param fields 字段定义
	 * @param params 参数值
	 * @return 解析后的查询对象
	 */
	public static ParsedSql parseInfluxDBFlux(String flux, List<JSONObject> fields, JSONObject params) {
		List<JSONObject> assignFields = ParamFieldParseUtil.assignValuesToFields(fields, JSONObject.toJSONString(params));
		
		// 解析Flux参数
		List<Object> paramValues = new ArrayList<>();
		if (assignFields != null && !assignFields.isEmpty()) {
			// 替换Flux中的参数占位符
			for (JSONObject jsonObject : assignFields) {
				if(jsonObject != null) {
					String identifier = jsonObject.getString("identifier");
					String replaceContent = jsonObject.getString("replaceContent");
					Object defaultValue = jsonObject.get("value");
					
					if(defaultValue == null || StrKit.isBlank(identifier) || StrKit.isBlank(defaultValue.toString())) {
						// 对于InfluxDB，如果参数为空，需要特殊处理
						flux = handleEmptyParameter(flux, replaceContent);
					}
					else {
						// 根据参数类型进行适当的格式化
						String formattedValue = formatInfluxDBValue(defaultValue);
						flux = flux.replace("${" + identifier + "}", formattedValue);
						paramValues.add(defaultValue);
					}
				}
			}
			return new ParsedSql(flux, paramValues);
		}
		return null;
	}
	
	/**
	 * 处理空参数的情况
	 */
	private static String handleEmptyParameter(String flux, String replaceContent) {
		// 移除包含空参数的过滤条件
		Pattern pattern = Pattern.compile("\\|>\\s*filter\\(.*?" + Pattern.quote(replaceContent) + ".*?\\)");
		Matcher matcher = pattern.matcher(flux);
		if (matcher.find()) {
			flux = matcher.replaceAll("");
		}
		return flux;
	}
	
	/**
	 * 格式化InfluxDB值
	 */
	private static String formatInfluxDBValue(Object value) {
		if (value == null) {
			return "null";
		}
		
		// 根据值的类型进行格式化
		if (value instanceof String) {
			return "\"" + value.toString().replace("\"", "\\\"") + "\"";
		} else if (value instanceof Number) {
			return value.toString();
		} else if (value instanceof Boolean) {
			return value.toString();
		} else if (value instanceof java.util.Date) {
			// 转换为InfluxDB时间格式
			return "time(" + ((java.util.Date) value).getTime() + ")";
		} else {
			// 其他类型转为字符串
			return "\"" + value.toString().replace("\"", "\\\"") + "\"";
		}
	}
	
	/**
	 * 解析SQL并转换为Record对象
	 * @param sql SQL语句
	 * @param fields 字段定义
	 * @param params 参数值
	 * @return Record对象，包含解析后的SQL和参数
	 */
	public static Record parseSqlToRecord(String sql, List<JSONObject> fields, JSONObject params) {
		List<JSONObject> assignFields = ParamFieldParseUtil.assignValuesToFields(fields, JSONObject.toJSONString(params));
		if (assignFields == null ||assignFields.isEmpty()) {
			return null;
		}
		Record record = new Record();
		for(JSONObject field:assignFields) {
			record.set(field.getString("identifier"), field.get("value"));
		}
		return record;
	}
	
	/**
	 * 从Record中获取SQL语句
	 * @param record Record对象
	 * @return SQL语句
	 */
	public static String getSqlFromRecord(Record record) {
		return record.getStr("sql");
	}
	
	/**
	 * 从Record中获取参数数组
	 * @param record Record对象
	 * @return 参数数组
	 */
	public static Object[] getParamsFromRecord(Record record) {
		Object params = record.get("params");
		if (params instanceof Object[]) {
			return (Object[]) params;
		}
		return new Object[0];
	}
}
